package file

import (
	"encoding/json"
	"fmt"
	log "github.com/sirupsen/logrus"
	"io/ioutil"
	"os"
	"path/filepath"
	"sort"
	"time"
)

//存储内存数据快照到文件系统中
func Storememdata(storepath string, memdata map[string]interface{}) {
	//目录不存在则创建
	if _, err := os.Stat(storepath); os.IsNotExist(err) {
		os.MkdirAll(storepath, os.ModePerm)
	}
	//文件不存在则创建
	filename := fmt.Sprintf("%s%v%v%s", storepath, string(os.PathSeparator), time.Now().UnixNano(), ".log")
	//log.Debug("创建的文件:" + filename)

	if _, err := os.Stat(filename); os.IsNotExist(err) {
		file, err := os.Create(filename)
		defer file.Close()
		if err != nil {
			log.Debug(err)
		}

		data, _ := json.Marshal(memdata)
		//把内存数据写到文件中
		file.Write(data)
		//把缓存页刷到硬盘
		file.Sync()
	}

}

type tempFileDesc struct {
	filename string
	fpath    string
}

type tempFileDescs []tempFileDesc

//数据分片切片长度
func (s tempFileDescs) Len() int {
	return len(s)
}

//数据分片的数据交换
func (s tempFileDescs) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}

//数据分片的比较
func (s tempFileDescs) Less(i, j int) bool {
	//降序
	return s[i].filename > s[j].filename
}

//清理元数据log文件，只保留最新的五个文件
func ClearLogfile(storepath string) {
	files := make([]tempFileDesc, 0)
	filepath.Walk(storepath, func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}
		if f.IsDir() {
			//log.Debug("dir:", path)
			return nil
		}
		ioutil.ReadFile(path)
		tf := tempFileDesc{
			filename: f.Name(),
			fpath:    path,
		}
		files = append(files, tf)
		//log.Println("file=>", path, "f=>", f.Name())
		return nil
	})
	//移除老的文件
	if len(files) > 5 {
		tfs:=tempFileDescs(files)
		sort.Stable(tfs)
		tfs = tfs[5:]
		for _, v := range tfs {
			os.Remove(v.fpath)
		}
	}

}
